var express = require('express');
var router = express.Router();
const SMSClient = require("@alicloud/sms-sdk")
var { user, RefreshToken } = require('../model/model.js')
const md5 = require('md5')
const jwt = require('jsonwebtoken')
// const bcrypt = require('bcryptjs');
const { main, main1 } = require('../face.js')
//main()是百度云的人脸注册
//main1()是百度云的人脸搜索

/* GET home page. */
router.get('/', function (req, res, next) {
    res.render('index', { title: 'Express' });
});

const accessKeyId = "LTAI5t8thyXcZurY2bv6K8Ft"; // 替换为你的 AccessKey ID
const secretAccessKey = "GN7Rs5FtpRzSB00g660blBSAg6awvy"; // 替换为你的 AccessKey Secret
const smsClient = new SMSClient({ accessKeyId, secretAccessKey });
// 生成访问令牌
function generateAccessToken(userId) {
    return jwt.sign({ userId }, 'your_access_token_secret', { expiresIn: '5s' });
}

// 生成刷新令牌
function generateRefreshToken(userId) {
    return jwt.sign({ userId }, 'your_refresh_token_secret',{ expiresIn: '1d' });
}
// 受保护的路由
router.get('/protected', authenticateToken, (req, res) => {
    res.send('This is a protected route');
});

// 验证访问令牌
function authenticateToken(req, res, next) {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1];
    if (token == null) return res.status(401).send('No token provided');
    jwt.verify(token, 'your_access_token_secret', (err, user) => {
        if (err) return res.status(403).send('Invalid token');
        req.user = user;
        next();
    });
}
// 刷新令牌路由
router.post('/refresh', async (req, res) => {
    const { refreshToken } = req.body;
    if (!refreshToken) {
        return res.status(401).send('未提供刷新令牌');
    }
    const storedToken = await RefreshToken.findOne({ token: refreshToken });// 查询数据库中的刷新令牌
    if (!storedToken) {// 如果没有找到刷新令牌，则返回错误
        return res.status(403).send('刷新令牌无效');
    }
    // 如果找到了刷新令牌，则验证它是否过期
    jwt.verify(refreshToken, 'your_refresh_token_secret', (err, user) => {// 验证刷新令牌
        if (err) return res.status(403).send('刷新令牌已过期');
        const newAccessToken = generateAccessToken(user.userId);
        res.json({ accessToken: newAccessToken });
    });
});


// 用户名密码登录接口
router.post('/login', async function (req, res, next) {
    const { username, password } = req.body;
    console.log(username, password);
    if (!username || !password) {
        return res.status(400).json({ code: 400, message: '用户名和密码不能为空' });
    }
    try {
        const hashedPassword = md5(password);
        const userData = await user.findOne({ name: username, password: hashedPassword });
        if (userData) {
            const accessToken = generateAccessToken(user._id);
            const refreshToken = generateRefreshToken(user._id);
            await new RefreshToken({ token: refreshToken, userId: user._id }).save();
            res.json({code:200,message: '登录成功', accessToken, refreshToken,userid:userData._id });
        } else {
            res.json({ code: 400, message: '用户名或密码输入有误' });
        }
    } catch (error) {
        console.error('登录失败:', error);
        res.status(500).json({ code: 500, message: '服务器内部错误' });
    }
});

// 发送短信验证码的接口
router.post("/send-sms", async (req, res) => {
    const { phoneNumber } = req.body;

    if (!phoneNumber) {
        return res.status(400).json({ success: false, message: "手机号不能为空" });
    }
    // 生成随机验证码
    const code = Math.floor(100000 + Math.random() * 900000).toString();
    try {
        // 调用阿里云短信服务
        const result = await smsClient.sendSMS({
            PhoneNumbers: phoneNumber, // 目标手机号
            SignName: "云服务器connect", // 短信签名（需与阿里云控制台一致）
            TemplateCode: "SMS_480690178", // 短信模板CODE（需与阿里云控制台一致）
            TemplateParam: `{"code":"${code}"}`, // 短信模板中的变量
        });
        console.log("阿里云返回结果:", JSON.stringify(result, null, 2)); // 打印阿里云返回的结果
        if (result.Code === "OK") {
            // 验证码发送成功
            console.log(`验证码已发送至 ${phoneNumber}，验证码为：${code}`);
            res.json({ success: true, message: "验证码发送成功", code: code });//将生成的验证码返回给前端
        } else {
            // 发送失败
            console.error("短信发送失败:", result.Message);
            res.status(500).json({
                success: false,
                message: "短信发送失败",
                error: result.Message,
            });
        }
    } catch (error) {
        console.error("短信服务异常:", error.message);
        res.json({ success: false, message: "验证码发送失败" });//返回给前端错误
    }
});

// 短信验证码登录接口
router.post('/telpLogin', async function (req, res, next) {
    const { phoneNumber } = req.body;
    if (!phoneNumber) {
        return res.status(400).json({ code: 400, message: '手机号不能为空' });
    }
    try {
        const existingUser = await user.findOne({ telp: phoneNumber });
        if (!existingUser) {
            return res.json({ code: 400, message: '该手机号未注册' });
        }
        const uinfo = { phoneNumber };
        const token = jwt.sign(uinfo, '123');
        res.json({ code: 200, token: 'Bearer ' + token });
    } catch (error) {
        console.error('短信验证码登录失败:', error);
        res.status(500).json({ code: 500, message: '服务器内部错误' });
    }
});

// 人脸搜索判断接口
router.post('/faceLogin', async (req, res) => {
    const { faceImage } = req.body;
    if (!faceImage) {
        return res.status(400).json({ error: '人脸图像不能为空' });
    }
    try {
        const score = await main1(faceImage);
        // 这里可以根据 score 进行判断是否登录成功，这里简单假设 score 大于某个值就登录成功
        if (score > 93) {
            // 假设通过人脸搜索找到了对应的用户名
            const username = 'found_username';
            const uinfo = { username };
            const token = jwt.sign(uinfo, '123');
            res.json({ code: 200, token: 'Bearer ' + token });
        } else {
            res.json({ code: 400, message: '人脸识别登录失败' });
        }
    } catch (error) {
        console.error(error);
        res.status(500).json({ code: 500, message: '服务器内部错误' });
    }
});

// 合并后的注册接口
router.post('/register', async function (req, res, next) {
    const { username, password, phoneNumber, faceImage } = req.body;
    try {
        const existingUser = await user.findOne({ name: username });
        if (existingUser) {
            return res.json({ code: 201, message: '该用户名已注册' });
        }
        const existingUser1 = await user.findOne({ telp: phoneNumber });
        if (existingUser1) {
            return res.json({ code: 201, message: '该手机号已注册' });
        }
        const result = await main(faceImage);
        if (result) {
            const hashedPassword = md5(password);
            await user.create({ name: username, password: hashedPassword, telp: phoneNumber, faceImage });
            return res.json({ code: 200, message: '注册成功' });
        } else {
            return res.json({ code: 201, message: '注册失败' });
        }

    } catch (error) {
        console.error('注册失败:', error);
        res.status(500).json({ code: 500, message: '服务器内部错误' });
    }
});
//获取用户信息
router.post('/getUserInfo', async function (req, res, next) {
    const { username, password, phoneNumber, faceImage } = req.body; // 获取请求体中的数据
    try {
        if (username && password) {
            const existingUser = await user.findOne({ name: username, password: md5(password) });
            if (existingUser) {
                return res.json({ code: 200, data: existingUser });
            }
        }
        if (phoneNumber) {
            const existingUser = await user.findOne({ telp: phoneNumber });
            if (existingUser) {
                return res.json({ code: 200, data: existingUser });
            }
            if (existingUser) {
                return res.json({ code: 200, data: existingUser });
            }
        }
        if (faceImage) {
            const existingUser = await user.findOne({ faceImage: faceImage });
            if (existingUser) {
                return res.json({ code: 200, data: existingUser });
            }
        }
    } catch (error) {
        console.error('获取用户信息失败:', error);
        res.status(500).json({ code: 500, message: '服务器内部错误' });
    }
})





module.exports = router;